from scapy.all import *

#dpdk
#pyshark--需要winshark支持--pass

#写 pcap
# 构造报文，并写到文件中，
pkt=Ether()/IP(dst='192.168.8.1')/TCP(dport=80)

pkt.summary()
pkt[1].src
pkt[1].dst
pkt[1].show()
IP in pkt   #判断是否存在IP层

wrpacp('F://pkt.pcap',pkt)


#读入 pcap
# 该函数返回的f是一个scapy.plist.PacketList（可以看做一个list进行运算）类型可以通过f[i]来读取

f=scapy.rdpcap('path_pcap')

# 使用f[0].show()或f[0].display()进行数据包格式化打印。
# 该方法将数据全部读入内存--数据包大的时候容易卡顿
# f[0]指第一层，通过f[0].payload可以得到该层协议的载荷部分，通过重复调用payload方法可以找到自己需要的层，并对其下的字段进行提取分析。
f[0].show()
f[0].payload.src  #获取数据包的源ip地址

# session()
# 该方法将读入的数据包列表分为对话组存储，以源IP和目的IP为分化标准，但是当源IP和目的IP位置变换的时候将会被视为不同的分组，

########################################################################
# 在wireshark抓个包并导出pcap / pcapng文件，直接对此文件进行分析

import scapy.all as scapy


def count_packets(pkt):
    global icmp_count
    for packet in pkt:
        if packet.haslayer('ICMP'):
            icmp_count += 1


# pkt = scapy.rdpcap("./test.pcap")
pkt = scapy.rdpcap("./test.pcapng")
icmp_count = 0
count_packets(pkt)
print(pkt)
sum = len(pkt)
icmp_percent = (icmp_count / sum) * 100
print("流量包的总数: %d\nICMP包的数量: %d; 占比：%.2f%%" % (sum, icmp_count, icmp_percent))






